package eventos.aceptar;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;

import logica.AtributoRepetidoException;
import logica.EntidadRepetidaException;
import logica.IdExternoInexistenteException;
import logica.Relacion;
import logica.RelacionException;
import logica.SinNombreException;
import memento.IMemento;

import controlador.IObjDelModConRefExternaEntidad;
import controlador.NoExisteEntidadGraficable;

import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.GraficableException;
import vista.objetos.ProyectoGraficable;
import vista.objetos.RelacionGraficable;
import vista.paneles.NingunElementoSeleccionadoException;
import vista.ventanas.VentanaRelacion;

public class EventoAceptarRelacionEditada  extends MouseAdapter {
	
	private VentanaRelacion ventana;
	private IObjDelModConRefExternaEntidad controlador;
	private RelacionGraficable relacion;
	
	public EventoAceptarRelacionEditada(VentanaRelacion ventana, IObjDelModConRefExternaEntidad controlador, RelacionGraficable relacion)
	{
		super();
		this.ventana = ventana;
		this.controlador = controlador;
		this.relacion = relacion;
	}
	
	public void mouseClicked(MouseEvent evento)
	{	
		ProyectoGraficable proyecto = this.controlador.getProyectoActual();
		IMemento memento = this.controlador.getGraficableEditando();
		
		try 
		{
			Relacion relacionLog = this.ventana.getRelacionEditadaTemporal();
			this.controlador.verificarSiSePuedeAgregarObjeto(relacionLog);
			
			relacionLog = this.ventana.getRelacion();
			
			/*verifico que los nuevos atributos sean consistentes y las entidades a agregar tmb*/
			proyecto.verficarSiSePuedeEditar(relacion);
			
			/*borro la relación para redibujar, solo tengo que borrar esta porque es la que se está viendo*/
			this.relacion.borrarseDeLaHoja();

			/*si llegó acá es porque todo está bien. Entonces, altero todas las copias de esa relación
			 * que puedan llegar a haber en los distintos diagramas*/
			proyecto.editar(relacion, this.ventana.getFabricaRelacionGraficable().getTipoRelacionGraficable());

			this.controlador.actualizarGraficableConAtributos(this.relacion);
			//si hasta este punto no saltó ninguna excepción entonces guardo el estado anterior para deshacer
			this.controlador.guardarMemento(memento);
			this.controlador.sacarGraficableEditando();

			this.ventana.setVisible(false);
			this.ventana = null;	
		}
		catch (RelacionException e1)
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error al crear la Relacion", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (SinNombreException e1)
		{
			JOptionPane.showMessageDialog(this.ventana, "La relación debe tener nombre.", "Relacion sin nombre", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		} 
		catch (AtributoRepetidoException e1)
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Atributo repetido", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (EntidadRepetidaException e1)
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Referencia repetida", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (NoExisteEntidadGraficable e1)
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Referencia inexistente", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		} 
		catch (IdExternoInexistenteException e1) 
		{
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Identificador externo inexistente", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		}
		catch (NingunElementoSeleccionadoException e1)
		{// se supone q no puede pasar
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error Inesperado", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		} 
		catch (AtributoTipoNoSoportadoException e) 
		{// Se supone q no debería pasar
			JOptionPane.showMessageDialog(this.ventana, e.getMessage(), "Error al editar la Relacion", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		} 
		catch (GraficableException e1)
		{// Se supone q no debería pasar
			JOptionPane.showMessageDialog(this.ventana, e1.getMessage(), "Error Inesperado", JOptionPane.ERROR_MESSAGE);
			memento.cargarMemento();
		} 
	}
}
